package backend;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import java.text.DecimalFormat;

/**
 *
 * @author Christian Janke, Simon Huneck
 */
public class Punkt {
    
    private double x,y;
    
    /**Klasse fuer Punkte/Koordinaten
     * 
     * @param x x-Wert des Punktes
     * @param y y-Wert des Punktes
     */
    public Punkt(double x, double y){
        this.x = x;
        this.y = y;
    }
    
    public Punkt(double lon, double lat, boolean a){
        Coordinates.UTMPoint utm = new Coordinates.UTMPoint();
        Coordinates.WGS84Point wgs = new Coordinates.WGS84Point();
        wgs.SetDegrees(lat, lon);
        Coordinates.convertWGS84toUTM(wgs, utm);
        this.x = utm.x;
        this.y = -utm.y;
        //this(lon * 20037508.34 / 180 / 2, (Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180)) * 20037508.34 / 180 / 2);
    }
    
    /** Gibt x-Wert zurueck
     * 
     * @return x-Wert
     */
    public double getX(){
        return this.x;
    }
    
    public void setX(double x){
        this.x = x;
    }
    
    /** Gibt y-Wert zurueck
     * 
     * @return y-Wert
     */
    public double getY(){
        return this.y;
    }
    
    public void setY(double y){
        this.y = y;
    }
    
    /** Berechnet Abstand von zwei Punkten
     * 
     * @param a erster Punkt
     * @param b zweiter Punkt
     * @return Abstand
     */
    public static double dist(Punkt a, Punkt b){
        return (double) Math.sqrt(Math.pow((a.getX() - b.getX()), 2) + Math.pow((a.getY() - b.getY()), 2));
    }
    
    /** Gibt delta X aus
     * 
     * @param a Punkt
     * @return delta x
     */
    public double deltaX(Punkt a){
        return a.getX()-this.getX();
    }
    
    /** Gibt delta Y aus
     * 
     * @param a Punkt
     * @return delta Y
     */
    public double deltaY(Punkt a){
        return a.getY()-this.getY();
    }
    
    
    
    /** Vergleichsoperator fuer Punkt mit anderem Punkt a
     * 
     * @param a anderer Punkt
     * @return true/false
     */
    public boolean equals(Punkt a){
        return ((a.getX() == this.getX()) && (a.getY() == this.getY()));
    }
    
    /** Rundet die Zahl auf 2 Nachkommastellen und gibt den String zurueck
     * 
     * @param a Zahl
     * @return String der Zahl mit 2 Nachkommastellen
     */
    public static String myRound(double a){
        DecimalFormat df = new DecimalFormat( "0.00" );
        return df.format( a );
    }
    
    public static Double winkel(Punkt a, Punkt b){
        if (a.getX() == b.getX()){  //Senkrecht nach oben
            if (a.getY() < b.getY())
                return 90.0;
            else 
            if (a.getY() > b.getY())
                return -90.0;
            
            else return 0.0;            
        }
        else {
            return Math.atan(a.deltaY(b)/a.deltaX(b));
        }
    }
    
    @Override
    public String toString(){
        return "(" + myRound(this.getX()) + " | " + myRound(this.getY()) + ")";
    }
}
